package com.it.myreflect2;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;

public class MyReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        /*
            Class类中用于获取构造方法的方法
                Constructor[] getConstructors();返回所有公共构造方法对象的数组
                Constructor[] getDeclaredConstructors();返回所有构造方法对象的数组
                Constructor getConstructor(Class…parameterTypes);返回单个公共构造方法对象
                Constructor getDeclaredConstructor(Class……parameterTypes);返回单个构造方法对象
            Constructor类中用于创建对象的方法
                T newInstance(Object... initargs);根据指定的构造方法创建对象
                setAccessible(boolean flag);设置为true，表示取消访问检查
         */
        //1.获取class字节码文件对象
        Class clazz = Class.forName("com.it.myreflect2.Student");
        //2.获取构造方法
        //返回所有公共构造方法对象的数组
        /*System.out.println("----返回所有公共构造方法对象的数组----");
        Constructor[] con1 = clazz.getConstructors();
        for(Constructor c : con1){
            System.out.println(c);
        }
        System.out.println("----返回所有构造方法对象的数组----");
        Constructor[] con2 = clazz.getDeclaredConstructors();
        for(Constructor c : con2) {
            System.out.println(c);
        }

        System.out.println("----返回单个构造方法对象（无参的构造方法）----");
        Constructor cons1 = clazz.getDeclaredConstructor();
        System.out.println(cons1);

        System.out.println("----返回单个构造方法对象（有参的构造方法）-----");
        Constructor cons2 = clazz.getDeclaredConstructor(String.class);
        System.out.println(cons2);

        System.out.println("----返回单个构造方法对象(受保护的)----");
        Constructor con3 = clazz.getDeclaredConstructor(int.class);
        System.out.println(con3);
*/
        //getDeclaredConstructor（）该方法只能让我们看见对象
        Constructor con4 = clazz.getDeclaredConstructor(String.class, int.class);
        System.out.println(con4);
        //获取权限修饰符
        //int modifiers = con4.getModifiers();
        //System.out.println(modifiers);//公有返回1，私有返回2

        //获取到构造方法所有的参数
        /*Parameter[] parameters = con4.getParameters();
        for(Parameter p : parameters){
            System.out.println(p);
        }*/

        //Student s = new Student("张三",23);//现在是私有，无权访问
        //表示临时取消权限校验
        con4.setAccessible(true);
        Student stu = (Student) con4.newInstance("张三", 23);//Object强转Student类型
        System.out.println(stu);
    }
}
